/*
 * Copyright 2008 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.dopdf.utils;

/**
 * This class holds all the constants in this project.
 *
 * @author Deep Shah
 */
public class Constants {

    /**
     * The class that holds constatns for the cache class
     *
     * @author Deep Shah
     */
    public class Cache {

        /**
         * The load factor for the cache.
         */
        public static final float LOAD_FACTOR = 0.75f;

        /**
         * The max size of the cahce.
         */
        public static final int SIZE = 15;

        /**
         * The max capacity of the cahce.
         */
        public static final int MAX_CAPACITY = ((int) (SIZE / LOAD_FACTOR) + 1);
    }

    /**
     * The class that holds the constants for the resources.
     *
     * @author Deep Shah
     */
    public class Resource {

        /**
         * The content type of jpeg images.
         */
        public static final String JPEG_CONTENT_TYPE = "image/jpeg";

        /**
         * The content type of png images.
         */
        public static final String PNG_CONTENT_TYPE = "image/png";

        /**
         * The content type of pdf document.
         */
        public static final String PDF_CONTENT_TYPE = "application/pdf";

        /**
         * The constant that represents the jpeg format.
         */
        public static final String JPEG_FORMAT = "jpeg";

        /**
         * The constant that represents the png format.
         */
        public static final String PNG_FORMAT = "png";

        /**
         * Text plain content type.
         */
        public static final String TEXT_CONTENT_TYPE = "text/plain";

        /**
         * The constant that represents the javascript format.
         */
        public static final String JAVASCRIPT_FORMAT = "js";

        /**
         * The constant that represents the css format.
         */
        public static final String CSS_FORMAT = "css";

        /**
         * The string pattern that identifies that the request is for a static resource.
         */
        public static final String STATIC_RESOURCE_PATTERN = ".+/static/.+(js|css|png)$";

        /**
         * The string pattern that identifies the download request.
         */
        public static final String DOWNLOAD_RESOURCE_PATTERN = ".+download/document*";

        /**
         * The pattern that identifies the pdf page request.
         */
        public static final String PDF_PAGE_RESOURCE_PATTERN = ".+/page/show*";
    }

    /**
     * The class that holds he PDFPage related constants.
     */
    public class PDFPage {

        /**
         * The constant representing the id key.
         */
        public static final String ID_KEY = "id";

        /**
         * The constant representing the strategy key.
         */
        public static final String STRATEGY_KEY = "strategy";

        /**
         * The constant representing the Page key.
         */
        public static final String PAGE_KEY = "page";

        /**
         * The size of the page to be rendered.
         */
        public static final String SIZE_KEY = "size";
    }

    /**
     * The constants for the DocumentHashingStrategy.
     *
     * @author Deep Shah
     */
    public enum PDFFetchingStrategy {
        /**
         * The constant that represents the LRU strategy.
         */
        LRU,
        /**
         * The constant that represents the SESSION strategy.
         */
        SESSION;

        /**
         * The method that returns an instance of PDFFetchingStrategy based on the strategy name passed as argument.
         *
         * @param pdfFetchingStrategyName the name of the strategy to use.  If null or empty is passed LRU will be returned.
         * @return The reference of PDFFetchingStrategy that matches the name passed.
         */
        public static PDFFetchingStrategy parse(final String pdfFetchingStrategyName) {
            if (pdfFetchingStrategyName == null
                    || pdfFetchingStrategyName.equals("")
                    || pdfFetchingStrategyName.equalsIgnoreCase(Constants.General.UNDEFINED)) return LRU;

            return valueOf(pdfFetchingStrategyName.toUpperCase());
        }
    }

    /**
     * The enum that holds various page sizes.
     *
     * @author Deep Shah
     */
    public enum PageSize {
        /**
         * The small page size.
         */
        SMALL(392, 554),

        /**
         * The medium page size.
         */
        MEDIUM(617, 873),

        /**
         * The large page size.
         */
        LARGE(853, 1207);

        /**
         * The width represented by this size.
         */
        private int width;

        /**
         * The height represented by this size.
         */
        private int height;

        /**
         * The constructor that takes in width and height as argument.
         *
         * @param width  the width.
         * @param height the height.
         */
        private PageSize(final int width, final int height) {
            this.width = width;
            this.height = height;
        }

        /**
         * The method that will return an instance of page size based on the string value of size passed.
         * If null of empty string is passed medium will be returned.
         *
         * @param size the string value of size to use.
         * @return the PageSize reference that matches the size passed in.
         */
        public static PageSize parse(final String size) {
            if (null == size || size.equals("") || size.equalsIgnoreCase(Constants.General.UNDEFINED)) return MEDIUM;
            return valueOf(size.toUpperCase());
        }

        /**
         * The getter for the width.
         *
         * @return the value held.
         */
        public int getWidth() {
            return width;
        }

        /**
         * The getter for the height.
         *
         * @return the value held.
         */
        public int getHeight() {
            return height;
        }
    }

    /**
     * The class that holds information about the general constants.
     *
     * @author Deep Shah
     */
    public class General {
        /**
         * The undefined value constant.
         */
        public static final String UNDEFINED = "UNDEFINED";
    }
}
